package bean.dao;

import java.util.List;

import hbt.HibernateUtil;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import bean.Cliente;
import bean.Item_SolicitudCliente;
import bean.Producto;
import bean.SolicitudDeCotizacion;

public class SolicitudDAO {
	private static SolicitudDAO instancia = null;
	private static SessionFactory sf = null;

	public static SolicitudDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new SolicitudDAO();
		} 
		return instancia;
	}
	
	/*LEE EL ARCHIVO XML Y GUARDA LOS DATOS DE LA SOLICITUD DE COTIZACION EN LA BASE DE DATOS*/
	public void cargarSolicitudDeCotizacion(String archivo){
		SolicitudDeCotizacion solicitud;
		try {
			solicitud = XmlDAO.getInstancia().cargarSolicitudDeCotizacion(archivo);
			Cliente cliente = new Cliente();
			cliente = ClienteDAO.getInstancia().buscarCliente (solicitud.getCliente().getCuil());
			Session session = sf.openSession();
			session.beginTransaction();
			if (cliente==null){ //cliente no existe
				System.out.println ("Debe dar de alta el cliente antes de ingresar una solicitud");
				return;				
			}
			session.persist(solicitud);			
			for (int i =0; i< solicitud.getItems().size();i++){
				Producto producto = ProductoDAO.getInstancia().buscarProducto (solicitud.getItems().get(i).getProducto().getId().getNroSerie(),solicitud.getItems().get(i).getProducto().getId().getSufijo());
				if (producto != null){ //el producto existe en la base lo traigo y se lo asigno
					solicitud.getItems().get(i).setProducto(producto);
					session.persist(solicitud.getItems().get(i));
				}
				else System.out.println("EL PRODUCTO NO EXISTE");
			}
			session.flush();
			session.getTransaction().commit();
			session.close();
		} catch (Exception e) {
			System.out.println (e.toString());
		}
	}
	
	
	public SolicitudDeCotizacion buscarSolicitud(int num, String fecha){
		SolicitudDeCotizacion solicitud = new SolicitudDeCotizacion();
		Session session = sf.openSession();
		Query query = session.createQuery("from SolicitudDeCotizacion s where (s.id.numero =:numero) and (s.id.fecha =:fecha)");
		query.setString("fecha",fecha);
		query.setParameter("numero", num);
		solicitud = (SolicitudDeCotizacion) query.uniqueResult();
		session.close();
		return solicitud;
	}
	
	@SuppressWarnings("unchecked")
	public List <Item_SolicitudCliente> buscarItemsSolicitud (int num, String fecha){
		Session session = sf.openSession();
		List <Item_SolicitudCliente> itemsSolicitud;
		Query query = session.createQuery("from Item_SolicitudCliente i where (i.solicitud.id.numero =:numero) and (i.solicitud.id.fecha =:fecha)");
		query.setString("fecha",fecha);
		query.setParameter("numero", num);
		itemsSolicitud = query.list();
		session.close();
		return itemsSolicitud;
	}
	
	
}	
